package com.colin.demo;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.extern.slf4j.Slf4j;

import java.util.Properties;
import java.util.concurrent.Executor;

/**
 * @author: colin
 * @Create: 2023/2/28 21:36
 */
@Slf4j
public class ConfigServerDemo {

    public static void main(String[] args) throws NacosException, InterruptedException {

        String serverAddr = "localhost:8848";
        String dataId = "colin-nacos-config";
        String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);

        // 获取配置中心服务
        ConfigService configService = NacosFactory.createConfigService(properties);

        // 从配置中心拉取配置
        String content = configService.getConfig(dataId, group, 5000);
        // 输出配置内容
        log.info("配置中心拉取的配置信息为：{}",content);

        /**
         * 注册监听器
         * 配置中心客户端会通过对配置项(dataId,group)注册监听器，以实现当配置项发生变更时，执行监听器的回调功能
         * Nacos 可以通过 NacosConfigService#addListener(dataId,group,Listener) 注册监听器，
         * 它内部是调用 ClientWorker 类的 addCacheDataIfAbsent() 方法实现的注册，返回结果为 CacheData
         * CacheData：维护配置项和其下注册的所有监听器的实例，
         * CacheData 都保存在 ClientWorker 类中的原子引用类中 AtomicReference<Map<String, CacheData>> cacheMap
         * 其内层 map 中数据的 key 是由 dataId, group, tenant 拼接而成，例如："colin-nacos-config+DEFAULT_GROUP"
         */
        configService.addListener(dataId, group, new Listener() {
            @Override
            public Executor getExecutor() {
                return null;
            }

            // 配置发生变化回调接口
            @Override
            public void receiveConfigInfo(String configInfo) {
                log.info("感知到配置发生了变化：{}",configInfo);
            }
        });

        // 发布配置
        //boolean isPublishOk = configService.publishConfig(dataId, group, "content");
        //System.out.println(isPublishOk);
        // 发送 properties 格式
        // configService.publishConfig(dataId,group,"common.addr=shanghai", ConfigType.PROPERTIES.getType());










        // 阻塞
        Thread.sleep(Integer.MAX_VALUE);

    }
}
